home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Musique / Quod Libet / quodlibet-3.3.0-installer.exe / bin / multiprocessing / queues.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2014-12-31  |  11KB  |  370 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.7)
  3.  
  4. __all__ = [
  5.     'Queue',
  6.     'SimpleQueue',
  7.     'JoinableQueue']
  8. import sys
  9. import os
  10. import threading
  11. import collections
  12. import time
  13. import atexit
  14. import weakref
  15. from Queue import Empty, Full
  16. import _multiprocessing
  17. from multiprocessing import Pipe
  18. from multiprocessing.synchronize import Lock, BoundedSemaphore, Semaphore, Condition
  19. from multiprocessing.util import debug, info, Finalize, register_after_fork
  20. from multiprocessing.forking import assert_spawning
  21.  
  22. class Queue(object):
  23.     
  24.     def __init__(self, maxsize = 0):
  25.         if maxsize <= 0:
  26.             maxsize = _multiprocessing.SemLock.SEM_VALUE_MAX
  27.         self._maxsize = maxsize
  28.         (self._reader, self._writer) = Pipe(duplex = False)
  29.         self._rlock = Lock()
  30.         self._opid = os.getpid()
  31.         if sys.platform == 'win32':
  32.             self._wlock = None
  33.         else:
  34.             self._wlock = Lock()
  35.         self._sem = BoundedSemaphore(maxsize)
  36.         self._after_fork()
  37.         if sys.platform != 'win32':
  38.             register_after_fork(self, Queue._after_fork)
  39.  
  40.     
  41.     def __getstate__(self):
  42.         assert_spawning(self)
  43.         return (self._maxsize, self._reader, self._writer, self._rlock, self._wlock, self._sem, self._opid)
  44.  
  45.     
  46.     def __setstate__(self, state):
  47.         (self._maxsize, self._reader, self._writer, self._rlock, self._wlock, self._sem, self._opid) = state
  48.         self._after_fork()
  49.  
  50.     
  51.     def _after_fork(self):
  52.         debug('Queue._after_fork()')
  53.         self._notempty = threading.Condition(threading.Lock())
  54.         self._buffer = collections.deque()
  55.         self._thread = None
  56.         self._jointhread = None
  57.         self._joincancelled = False
  58.         self._closed = False
  59.         self._close = None
  60.         self._send = self._writer.send
  61.         self._recv = self._reader.recv
  62.         self._poll = self._reader.poll
  63.  
  64.     
  65.     def put(self, obj, block = True, timeout = None):
  66.         if not not (self._closed):
  67.             raise AssertionError
  68.         if not None._sem.acquire(block, timeout):
  69.             raise Full
  70.         self._notempty.acquire()
  71.         
  72.         try:
  73.             if self._thread is None:
  74.                 self._start_thread()
  75.             self._buffer.append(obj)
  76.             self._notempty.notify()
  77.         finally:
  78.             self._notempty.release()
  79.  
  80.  
  81.     
  82.     def get(self, block = True, timeout = None):
  83.         if block and timeout is None:
  84.             self._rlock.acquire()
  85.             
  86.             try:
  87.                 res = self._recv()
  88.                 self._sem.release()
  89.                 return res
  90.             finally:
  91.                 self._rlock.release()
  92.  
  93.         elif block:
  94.             deadline = time.time() + timeout
  95.         if not self._rlock.acquire(block, timeout):
  96.             raise Empty
  97.         
  98.         try:
  99.             if block:
  100.                 timeout = deadline - time.time()
  101.                 if timeout < 0 or not self._poll(timeout):
  102.                     raise Empty
  103.             elif not self._poll():
  104.                 raise Empty
  105.             res = self._recv()
  106.             self._sem.release()
  107.             return res
  108.         finally:
  109.             self._rlock.release()
  110.  
  111.  
  112.     
  113.     def qsize(self):
  114.         return self._maxsize - self._sem._semlock._get_value()
  115.  
  116.     
  117.     def empty(self):
  118.         return not self._poll()
  119.  
  120.     
  121.     def full(self):
  122.         return self._sem._semlock._is_zero()
  123.  
  124.     
  125.     def get_nowait(self):
  126.         return self.get(False)
  127.  
  128.     
  129.     def put_nowait(self, obj):
  130.         return self.put(obj, False)
  131.  
  132.     
  133.     def close(self):
  134.         self._closed = True
  135.         self._reader.close()
  136.         if self._close:
  137.             self._close()
  138.  
  139.     
  140.     def join_thread(self):
  141.         debug('Queue.join_thread()')
  142.         if not self._closed:
  143.             raise AssertionError
  144.         if None._jointhread:
  145.             self._jointhread()
  146.  
  147.     
  148.     def cancel_join_thread(self):
  149.         debug('Queue.cancel_join_thread()')
  150.         self._joincancelled = True
  151.         
  152.         try:
  153.             self._jointhread.cancel()
  154.         except AttributeError:
  155.             pass
  156.  
  157.  
  158.     
  159.     def _start_thread(self):
  160.         debug('Queue._start_thread()')
  161.         self._buffer.clear()
  162.         self._thread = threading.Thread(target = Queue._feed, args = (self._buffer, self._notempty, self._send, self._wlock, self._writer.close), name = 'QueueFeederThread')
  163.         self._thread.daemon = True
  164.         debug('doing self._thread.start()')
  165.         self._thread.start()
  166.         debug('... done self._thread.start()')
  167.         if not self._joincancelled:
  168.             self._jointhread = Finalize(self._thread, Queue._finalize_join, [
  169.                 weakref.ref(self._thread)], exitpriority = -5)
  170.         self._close = Finalize(self, Queue._finalize_close, [
  171.             self._buffer,
  172.             self._notempty], exitpriority = 10)
  173.  
  174.     
  175.     def _finalize_join(twr):
  176.         debug('joining queue thread')
  177.         thread = twr()
  178.         if thread is not None:
  179.             thread.join()
  180.             debug('... queue thread joined')
  181.         else:
  182.             debug('... queue thread already dead')
  183.  
  184.     _finalize_join = staticmethod(_finalize_join)
  185.     
  186.     def _finalize_close(buffer, notempty):
  187.         debug('telling queue thread to quit')
  188.         notempty.acquire()
  189.         
  190.         try:
  191.             buffer.append(_sentinel)
  192.             notempty.notify()
  193.         finally:
  194.             notempty.release()
  195.  
  196.  
  197.     _finalize_close = staticmethod(_finalize_close)
  198.     
  199.     def _feed(buffer, notempty, send, writelock, close):
  200.         debug('starting thread to feed data to pipe')
  201.         is_exiting = is_exiting
  202.         import util
  203.         nacquire = notempty.acquire
  204.         nrelease = notempty.release
  205.         nwait = notempty.wait
  206.         bpopleft = buffer.popleft
  207.         sentinel = _sentinel
  208.         if sys.platform != 'win32':
  209.             wacquire = writelock.acquire
  210.             wrelease = writelock.release
  211.         else:
  212.             wacquire = None
  213.         
  214.         try:
  215.             while None:
  216.                 
  217.                 try:
  218.                     if not buffer:
  219.                         nwait()
  220.                 finally:
  221.                     nrelease()
  222.  
  223.                 
  224.                 try:
  225.                     while None:
  226.                         obj = bpopleft()
  227.                         if obj is sentinel:
  228.                             debug('feeder thread got sentinel -- exiting')
  229.                             close()
  230.                             return None
  231.                         if None is None:
  232.                             send(obj)
  233.                             continue
  234.                         
  235.                         try:
  236.                             send(obj)
  237.                         finally:
  238.                             wrelease()
  239.  
  240.                     continue
  241.                     except IndexError:
  242.                         continue
  243.                     
  244.                 except Exception:
  245.                     e = None
  246.                     
  247.                     try:
  248.                         if is_exiting():
  249.                             info('error in queue thread: %s', e)
  250.                         else:
  251.                             import traceback as traceback
  252.                             traceback.print_exc()
  253.                     except Exception:
  254.                         pass
  255.                     
  256.  
  257.  
  258.                 return None
  259.  
  260.  
  261.     _feed = staticmethod(_feed)
  262.  
  263. _sentinel = object()
  264.  
  265. class JoinableQueue(Queue):
  266.     
  267.     def __init__(self, maxsize = 0):
  268.         Queue.__init__(self, maxsize)
  269.         self._unfinished_tasks = Semaphore(0)
  270.         self._cond = Condition()
  271.  
  272.     
  273.     def __getstate__(self):
  274.         return Queue.__getstate__(self) + (self._cond, self._unfinished_tasks)
  275.  
  276.     
  277.     def __setstate__(self, state):
  278.         Queue.__setstate__(self, state[:-2])
  279.         (self._cond, self._unfinished_tasks) = state[-2:]
  280.  
  281.     
  282.     def put(self, obj, block = True, timeout = None):
  283.         if not not (self._closed):
  284.             raise AssertionError
  285.         if not None._sem.acquire(block, timeout):
  286.             raise Full
  287.         self._notempty.acquire()
  288.         self._cond.acquire()
  289.         
  290.         try:
  291.             if self._thread is None:
  292.                 self._start_thread()
  293.             self._buffer.append(obj)
  294.             self._unfinished_tasks.release()
  295.             self._notempty.notify()
  296.         finally:
  297.             self._cond.release()
  298.             self._notempty.release()
  299.  
  300.  
  301.     
  302.     def task_done(self):
  303.         self._cond.acquire()
  304.         
  305.         try:
  306.             if not self._unfinished_tasks.acquire(False):
  307.                 raise ValueError('task_done() called too many times')
  308.             if self._unfinished_tasks._semlock._is_zero():
  309.                 self._cond.notify_all()
  310.         finally:
  311.             self._cond.release()
  312.  
  313.  
  314.     
  315.     def join(self):
  316.         self._cond.acquire()
  317.         
  318.         try:
  319.             if not self._unfinished_tasks._semlock._is_zero():
  320.                 self._cond.wait()
  321.         finally:
  322.             self._cond.release()
  323.  
  324.  
  325.  
  326.  
  327. class SimpleQueue(object):
  328.     
  329.     def __init__(self):
  330.         (self._reader, self._writer) = Pipe(duplex = False)
  331.         self._rlock = Lock()
  332.         if sys.platform == 'win32':
  333.             self._wlock = None
  334.         else:
  335.             self._wlock = Lock()
  336.         self._make_methods()
  337.  
  338.     
  339.     def empty(self):
  340.         return not self._reader.poll()
  341.  
  342.     
  343.     def __getstate__(self):
  344.         assert_spawning(self)
  345.         return (self._reader, self._writer, self._rlock, self._wlock)
  346.  
  347.     
  348.     def __setstate__(self, state):
  349.         (self._reader, self._writer, self._rlock, self._wlock) = state
  350.         self._make_methods()
  351.  
  352.     
  353.     def _make_methods(self):
  354.         recv = self._reader.recv
  355.         racquire = self._rlock.acquire
  356.         rrelease = self._rlock.release
  357.         
  358.         def get():
  359.             racquire()
  360.             
  361.             try:
  362.                 return recv()
  363.             finally:
  364.                 rrelease()
  365.  
  366.  
  367.         self.get = get
  368.  
  369.  
  370.